home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 10 / amigaformatcd10.iso / -screenplay- / shareware / mris 1.1 / .mris1_1src.lha / ChangeUser.c < prev    next >
C/C++ Source or Header  |  1996-10-09  |  7KB  |  261 lines

  1. #define MYLIB_BOOPSI
  2.  
  3. #ifndef INTUITION_GADGETCLASS_H
  4. #include <intuition/gadgetclass.h>
  5. #endif
  6.  
  7. #ifndef INTUITION_IMAGECLASS_H
  8. #include <intuition/imageclass.h>
  9. #endif
  10.  
  11. #include <proto/layers.h>
  12.  
  13. #include "xmris.h"
  14. #include "ChangeUser.h"
  15. #include "BOOPSILib.h"
  16.  
  17. #include "Catalog.h"
  18.  
  19. /************************************************************************/
  20.  
  21. struct Window *ChangeUserWindow;
  22.  
  23. /************************************************************************/
  24.  
  25. static Object *Contents;
  26. static Object *String, *UseButton;
  27.  
  28. static struct TagItem WindowTags[]=
  29. {
  30.   {WA_Left, ~0},
  31.   {WA_Top, ~0},
  32.   {WA_Height, 0},
  33.   {WA_Width, 0},
  34.   {WA_CustomScreen, (ULONG)NULL},
  35.   {WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_GADGETUP | IDCMP_ACTIVEWINDOW | IDCMP_NEWSIZE},
  36.   {WA_MaxWidth, 0},
  37.   {WA_MaxHeight, 0},
  38.   {WA_MinWidth, 0},
  39.   {WA_MinHeight, 0},
  40.   {WA_Gadgets, NULL},
  41.   {WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SIMPLE_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP | WFLG_NEWLOOKMENUS | WFLG_NOCAREREFRESH},
  42.   {TAG_DONE}
  43. };
  44.  
  45. /************************************************************************/
  46.  
  47. void CloseChangeUserWindow(void)
  48.  
  49. {
  50.   if (ChangeUserWindow!=NULL)
  51.     {
  52.       LockLayerInfo(ChangeUserWindow->WLayer->LayerInfo);
  53.       WindowTags[0].ti_Data=ChangeUserWindow->LeftEdge;
  54.       WindowTags[1].ti_Data=ChangeUserWindow->TopEdge;
  55.       WindowTags[2].ti_Data=ChangeUserWindow->Height;
  56.       WindowTags[3].ti_Data=ChangeUserWindow->Width;
  57.       UnlockLayerInfo(ChangeUserWindow->WLayer->LayerInfo);
  58.       CloseWindowSafely(ChangeUserWindow);
  59.       ChangeUserWindow=NULL;
  60.     }
  61.   DisposeObject(Contents);
  62.   Contents=NULL;
  63.   FreeBOOPSIClasses();
  64. }
  65.  
  66. /************************************************************************/
  67.  
  68. void OpenChangeUserWindow(void)
  69.  
  70. {
  71.   if (ChangeUserWindow==NULL)
  72.     {
  73.       if (CreateBOOPSIClasses())
  74.     {
  75.       char *UseLabel, *CancelLabel;
  76.  
  77.       UseLabel=GetString(MSG_USE_BUTTON);
  78.       CancelLabel=GetString(MSG_CANCEL_BUTTON);
  79.       Contents=BOOPSILibO(Root),
  80.              BOOPSILibA_Group_Spacing, (1<<16)|1,
  81.  
  82.              BOOPSILibA_Group_Child, BOOPSILibO(Frame),
  83.                IA_FrameType, FRAME_RIDGE,
  84.                BOOPSILibA_Frame_Gadget, String=BOOPSILibO(String),
  85.                  STRINGA_MaxChars, sizeof(scoring.UserName),
  86.                  STRINGA_TextVal, scoring.UserName,
  87.                  GA_ID, MSG_GAME_USER_MENU,
  88.                  BOOPSILibO_End,  /* String */
  89.                BOOPSILibO_End,  /* Frame */
  90.  
  91.              BOOPSILibA_Group_Child, BOOPSILibO(Group),
  92.                BOOPSILibA_Group_Horizontal, TRUE,
  93.                BOOPSILibA_Group_SameSize, TRUE,
  94.  
  95.                BOOPSILibA_Group_Child, BOOPSILibO(Frame),
  96.                  IA_FrameType, FRAME_BUTTON,
  97.                  BOOPSILibA_Frame_Space, (40<<8),
  98.                  BOOPSILibA_Frame_Gadget, UseButton=BOOPSILibO(Button),
  99.                    GA_Text, UseLabel+1,
  100.                    BOOPSILibA_ControlChar, *UseLabel,
  101.                    GA_ID, MSG_USE_BUTTON,
  102.                    BOOPSILibO_End,  /* Button */
  103.                  BOOPSILibO_End,  /* Frame */
  104.  
  105.                BOOPSILibA_Group_Child, BOOPSILibO(Frame),
  106.                  IA_FrameType, FRAME_BUTTON,
  107.                  BOOPSILibA_Frame_Space, (40<<8),
  108.                  BOOPSILibA_Frame_Gadget, BOOPSILibO(Button),
  109.                    GA_Text, CancelLabel+1,
  110.                    BOOPSILibA_ControlChar, *CancelLabel,
  111.                    GA_ID, MSG_CANCEL_BUTTON,
  112.                    BOOPSILibO_End,  /* Button */
  113.                  BOOPSILibO_End,  /* Frame */
  114.  
  115.                BOOPSILibO_End,  /* Group */
  116.              BOOPSILibO_End;  /* Group */
  117.  
  118.       if (Contents!=NULL)
  119.         {
  120.           WindowTags[4].ti_Data=(ULONG)display.Screen->Screen;
  121.           WindowTags[5].ti_Tag=WA_IDCMP;
  122.           if (DoMethod(Contents,BOOPSILibM_Root_Init,WindowTags,20)==0)
  123.         {
  124.           WindowTags[5].ti_Tag=TAG_IGNORE;
  125.           ChangeUserWindow=OpenWindowTags(NULL,
  126.                           WA_ScreenTitle, display.window->ScreenTitle,
  127.                           WA_Title, GetString(MSG_CHANGEUSER_TITLE),
  128.                           TAG_MORE, WindowTags);
  129.           if (ChangeUserWindow!=NULL)
  130.             {
  131.               ChangeUserWindow->UserPort=&WindowPort;
  132.               if (ModifyIDCMP(ChangeUserWindow,WindowTags[5].ti_Data))
  133.             {
  134.               ActivateGadget((struct Gadget *)String,ChangeUserWindow,NULL);
  135.               return;
  136.             }
  137.             }
  138.         }
  139.         }
  140.     }
  141.       CloseChangeUserWindow();
  142.     }
  143.   else
  144.     {
  145.       ShowWindow(ChangeUserWindow);
  146.     }
  147. }
  148.  
  149. /************************************************************************/
  150.  
  151. static int NormalizeUser(char *User)
  152.  
  153. {
  154.   WORD Space;
  155.   WORD i;
  156.   int Changed;
  157.  
  158.   Changed=FALSE;
  159.   Space=TRUE;
  160.   for (i=0; User[i]!='\0'; i++)
  161.     {
  162.       if (User[i]==' ')
  163.     {
  164.       if (Space)
  165.         {
  166.           int j;
  167.  
  168.           for (j=i; (User[j]=User[j+1])!='\0'; j++)
  169.         ;
  170.           i--;
  171.           Changed=TRUE;
  172.         }
  173.       else
  174.         {
  175.           Space=TRUE;
  176.         }
  177.     }
  178.       else
  179.     {
  180.       Space=FALSE;
  181.     }
  182.     }
  183.   if (Space && i>0)
  184.     {
  185.       User[i-1]='\0';
  186.       Changed=TRUE;
  187.     }
  188.   return Changed;
  189. }
  190.  
  191. /************************************************************************/
  192.  
  193. static int NormalizeUserGadget(char *User)
  194.  
  195. {
  196.   WORD Position;
  197.  
  198.   Position=RemoveGadget(ChangeUserWindow,(struct Gadget *)String);
  199.   strcpy(User,(char *)AttrGet(String,STRINGA_TextVal));
  200.   if (NormalizeUser(User))
  201.     {
  202.       SetAttrs((struct Gadget *)String,STRINGA_TextVal,User,TAG_DONE);
  203.     }
  204.   AddGadget(ChangeUserWindow,(struct Gadget *)String,Position);
  205.   RefreshGList((struct Gadget *)String,ChangeUserWindow,NULL,1);
  206.   return User[0]!='\0';
  207. }
  208.  
  209. /************************************************************************/
  210.  
  211. void ProcessChangeUserWindow(struct IntuiMessage *Message)
  212.  
  213. {
  214.   if ((Message=(struct IntuiMessage *)DoMethod(Contents,BOOPSILibM_Root_ProcessMessage,Message))!=NULL)
  215.     {
  216.       switch (Message->Class)
  217.     {
  218.     case IDCMP_GADGETUP:
  219.       {
  220.         switch (((struct ExtGadget *)Message->IAddress)->GadgetID)
  221.           {
  222.           case MSG_GAME_USER_MENU:
  223.           case MSG_USE_BUTTON:
  224.         {
  225.           char User[80];
  226.  
  227.           assert(sizeof(User)==sizeof(scoring.UserName));
  228.           if (NormalizeUserGadget(User))
  229.             {
  230.               GS_ReleaseScoreHandle(scoring.ScoreHandle);
  231.               scoring.ScoreHandle=NULL;
  232.               strcpy(scoring.UserName,User);
  233.               UpdateWindowTitle();
  234.               /* fall through */
  235.  
  236.             case MSG_CANCEL_BUTTON:
  237.               DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
  238.               CloseChangeUserWindow();
  239.               return;
  240.             }
  241.         }
  242.         ActivateGadget((struct Gadget *)String,ChangeUserWindow,NULL);
  243.         break;
  244.           }
  245.       }
  246.       break;
  247.  
  248.     case IDCMP_CLOSEWINDOW:
  249.       DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
  250.       CloseChangeUserWindow();
  251.       return;
  252.  
  253.     case IDCMP_ACTIVEWINDOW:
  254.     case IDCMP_NEWSIZE:
  255.       ActivateGadget((struct Gadget *)String,ChangeUserWindow,NULL);
  256.       break;
  257.     }
  258.       DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
  259.     }
  260. }
  261.